/*-------------------------------------------------------------------------
 format(n,l,p) formats integers, reals and strings for output.  It converts 
 real or integer numbers n to signed decimal strings, with p digits after
 the decimal point for reals (p is irrelevant for integers and strings),
 and returns them, or strings n, either padded with leading spaces to make
 their lengths up to l or, if l is too small (in particular if l = 0), at
 full length without any leading spaces.  GNW 14/05/96
 --------------------------------------------------------------------------*/

#ifndef _BOBCONSTANTS
#include bob:Constants
#endif

#ifndef _string_format
#define _string_format 1
#endif

format(n,l,p)
{
  local d,dec,i,int,neg,r,s;
  s = "";
  switch (typeof(n))
    {
      case REAL:
        if (neg = (n < 0.0)) n = -n;
        r = 0.5;
        for (i = 0; i < p; i++) r /= 10.0;
        if (n < r) { n = 0.0; neg = FALSE; } else n += r;        
        int = floor(n);
        if (neg) s = "-";
        s += int_10(int);
        s += ".";
        dec = n - 1.0*int; 
        for (i = 0; i < p; i ++) dec *= 10.0;
        dec = floor(dec);
        d = "";
        for (i = 0;i < p; i ++)
          { d  = '0' + dec%10 + d; dec /= 10; }
        s += d;
        break;
      case INTEGER:
        if (neg = (n < 0)) n = -n;
        if (neg) s = "-";
        s += int_10(n);
        break;
      case STRING:
        s = n;
        break;
      default:
        s = "format: first argument not real, integer or string";        
    }
  for (i = l - sizeof(s); i > 0; i --) s = " " + s;
  return s;
}
 
int_10(n)
{
  local s;
  s = "";
  if (n == 0) s = "0";
  else while(n) { s = '0' + n%10 + s; n /= 10; }
  return s;
}
